為了順利地編寫 Go,重要的是要理解他的獨特特性和設計哲學,而不僅僅是將其他語言的程式碼翻譯成 Go。
換句話說,要在 Go 中寫出不錯的程式,需要以 Go 的思維方式來思考問題,並遵循他的規範與原則。這樣可以確保程式易於閱讀、維護並與其他Go程式協同工作。
這邊我想用官方提供的 Effective Go 來作延伸,這是學習 Golang 程式碼的重要指南,將探討幾個關鍵主題,包括格式化、注釋、命名和分號的使用。這些主題不僅關係到程式碼的外觀和風格,還影響到程式碼的可讀性、可維護性和品質。
Go 提供了 gofmt
工具,它會自動格式化程式碼,使其遵循一致的樣式和風格。
這邊我們可以注意到這個結構裡的型別與註釋接沒有整齊排列,然而在編寫程式碼時,誰還想花更多時間在處理擾人的格式?
type User struct{
ID int // User's Id
Name string // User's name
Email string // User's email
}
此時,gofmt 將為你服務!且只要是 Standard packages
皆支援
type User struct {
ID int // User's Id
Name string // User's name
Email string // User's email
}
All Go code in the standard packages has been formatted with gofmt.
注釋要是有意義的,而不僅僅是重複程式碼已經表達的事實。儘量避免冗長的注釋。注釋應該解釋為什麼某事這樣實現,而不是只描述它是如何實現的。
可使用支持C 風格的/* */
和 C++ 风格的行注释 //
。
舉例
// from initDB
// connectToDB tries to connect to postgres, and backs off until a connection
// is made, or we have not connected after 10 tries
func connectToDB() *sql.DB {
好的名稱是程式碼的關鍵。變數、函數、類型和常數的名稱應具有描述性,以便其他人容易理解您的程式碼。
import "fmt"
之後,可透過 fmt.Println
來使用
在 Go 語言中,Getter 是一種命名慣例,用於命名一個方法,該方法用於 讀取
未導出
變數的值。
type Person struct {
name string // 私有變數
}
// Getter 方法,用於獲取 name 的值
func (p *Person) GetName() string {
return p.name
介面是一種定義方法集合的抽象類型。這個原則主要針對只包含一個方法的介面,並建議使用特定的命名風格。
在方法名稱上加上 -er
構建一個代理名詞
舉例:
package main
import "fmt"
// Reader 介面,只包含一個 Read 方法
type Reader interface {
Read() string
}
// FileReader 實現了 Reader 介面
type FileReader struct {
content string
}
// 實現了 Reader 介面的 Read 方法
// Read 方法返回了 FileReader 結構的 content 字串。
func (fr FileReader) Read() string {
return fr.content
}
func main() {
// 將 "Hello, World!" 賦值給 content。
file := FileReader{content: "Hello, World!"}
// 定義了一個變數 reader,其類型是 Reader 介面。
var reader Reader
// 將 file(FileReader)賦值給 reader
reader = file // FileReader 實現了 Reader 介面
// 呼叫 reader.Read(),該方法 call 了 FileReader 結構的 Read 方法
content := reader.Read()
// 並印出 Hello World
fmt.Println(content)
}
駝峰記法有兩種:MixedCaps(混合大寫)和 mixedCaps(小寫開頭混合大寫)。
// MixedCaps 混合大寫
type HTTPRequestHandler struct {
}
func MyFunctionName() {
}
// mixedCaps mixedCaps 小寫開頭混合大寫
var myVariableName int
func processHTTPRequest() {
}
Go 語言不需要顯式分號 ;
來結束語句,因為它使用自動分號插入 automatic semicolon insertion
。
故,不必在每個語句的末尾添加分號。只有在多個語句在同一行時才需要分號。
不應將控制結構(如 if、for、switch、select)的左大括號放在下一行。
其實我一開始學習時,確實忽略了這個步驟。而我認為在真的開始寫程式之前,了解官方規範並遵循原則,往後編寫時才不會因為不理解而花更多時間成本尋找基本的規範。
今天稍微介紹 Effective Go 的前面幾個主題,若想更仔細的了解,可以透過超連結到官網閱讀。
我也正在學習路上,如內容有誤還請各位前輩與大神批評指教。
謝謝今日的閱讀,我們明天見!